home *** CD-ROM | disk | FTP | other *** search
/ Underground / Underground CD1.iso / crack / Howto1.txt < prev    next >
Encoding:
Text File  |  1999-01-12  |  25.4 KB  |  502 lines

  1.  
  2.               HOW TO CRACK, A TUTORIAL - LESSON 1
  3.                  by +ORC (the old red cracker)
  4.  
  5. -> How to crack, an approach                      LESSON 1
  6. How to crack, tools and tricks of the trade       LESSON 2
  7. How to crack, hands on, paper protections         LESSON 3 (1-2)
  8. How to crack, hands on, time limits               LESSON 4
  9. How to crack, hands on, disk-CDrom access         LESSON 5
  10. How to crack, funny tricks                        LESSON 6 (1-2)
  11. How to crack, intuition and luck                  LESSON 7
  12. How to crack windows, an approach                 LESSON 8
  13. How to crack windows, tools of the trade          LESSON 9
  14. How to crack, advanced cracking                   LESSON A (1-2)
  15. How to crack, zen-cracking                        LESSON B
  16. How to crack, cracking as an art                  LESSON C
  17. How to crack                                      INDEX
  18.  
  19. LESSON 1 - HOW TO CRACK, AN APPROACH                          
  20.  
  21.      The best way to learn cracking (i.e. understanding, broadly
  22. individuating, locating exactly and eliminating or suspending or
  23. deferring one or more protection schemes inside a software
  24. application you do not possess the source code of) is to begin
  25. your tampering experiments using OLDER applications which have
  26. OLDER protection schemes. 
  27.      In this way you 'll quickly grasp the base techniques of the
  28. trade. Do not forget that the evolution of the protection schemes
  29. has not been a one way road... strictly speaking it's not even
  30. an evolution: you'll eventually find some very clever new tricks,
  31. but most of the time you 'll unearth only various trite
  32. repetitions of past (and well known) tricks. This is no wonder:
  33. the REAL knowledge of the "commercial" programmers themselves
  34. (the "protectionists") is often very limited indeed: they are
  35. inclined to use the old methods (albeit somehow changed,
  36. sometimes even improved) instead of conceiving new methods. This
  37. typical "commercial" degeneration happens every time people act
  38. for money instead of doing things for the sake of it or for
  39. pleasure. This "commercial" trend is blindly encouraged by the
  40. stupid, money-oriented society we are coerced to live in. 
  41.      So I'll begin the "hands on" part (-> starting from lesson
  42. 3), using as examples, some "old" applications and some "old"
  43. tricks. We'll be able to come later over to the newest protection
  44. schemes in order to understand them, and you 'll learn how to
  45. defeat this kind of junk too. I'll also explain WHERE you can
  46. find a lot of programs to crack for next to no money at all, and
  47. HOW 'grossomodo', you should proceed in your work.
  48.      This tutorial is for people who are getting started with
  49. cracking. Maybe you are just contemplating doing some cracking,
  50. maybe you have tried it with mixed success. If you are here to
  51. get aimed in the right direction, to get off to a good start with
  52. the cracking tricks and procedures, then you have come for the
  53. right reason. I can't promise you'll get what you want, but I'll
  54. do my best. On the other hand, if you have already turned out
  55. some working cracking code in assembler and already cracked many
  56. different protection schemes, then this tutorial is likely to be
  57. on the elementary side for you. (If you want to review a few
  58. basics and have no where else pressing to go, then by all means
  59. stay). 
  60.      In order to crack successfully you need four basic things:
  61. *    A passing knowledge of assembler language (the more you
  62.      know, the better and quicker you crack)
  63. *    Some intuition
  64. *    Some help from more experienced cracker
  65. *    A non mercantile mind (more about this later)
  66. The applications you'll use to learn with can be divided into:
  67. 1    - Password crippled applications (the easiest to crack)
  68. 2    - applications crippled on how many times, or how many
  69.      days, you use them (fairly easy to crack)
  70. 3    - applications crippled on which date you use them before
  71.      (easy to crack)
  72. 4    - applications that have some functions present but
  73.      disabled (sometimes easy, sometimes difficult)
  74. 5    - applications crippled on Disk access (protections schemes
  75.      that are now defined as "obsolete") and applications
  76.      crippled on CD-ROM presence (more or less the same methods, but
  77.      -somehow- not defined as "obsolete") (very easy to crack)
  78. 6    - CRYPTOGRAFED ADDS ON (i.e. one of the previous protection
  79.      schemes, but with some scrambled or self modifying code
  80.      (XORring and SHRLing codes)or peppered with "junk" instructions
  81.      (fairly easy to crack)
  82. 7    - None of the above (sometimes difficult to crack)
  83.  
  84.  
  85. WHERE TO GET THE STUFF
  86.      The recent widespread appearance of "Demo"-CDROM on magazine
  87. covers is a treasure for all crackers! A short time after their
  88. release you 'll get all the copies that remain unsold for next
  89. to free. The demos on CD-ROMs will permit you to gather quickly
  90. a lot of applications -old and new- that have somehow been
  91. crippled (at times with interesting schemes). Truly a wonderful
  92. world of cracking possibilities! Gee! For next to no money you
  93. can secure on one CDROM the whole of LOTUS applications (or
  94. Microsoft or Wordperfect, or you name them) on "trial for 30
  95. days" or "try it 20 times" editions. You'll really enjoy to crack
  96. them, to use them for ever and ever and/or graciously donate them
  97. on the Web to the poor lamers that have no money and no brain.
  98.      GAMES are definitely not to be frowned upon! They are
  99. very interesting from a cracker prospective coz they are often
  100. "overprotected". With this I mean that they possess protection
  101. schemes of a relatively HIGH level hidden inside files that are
  102. relatively small. Now, see, it is much more easy, and simple, to
  103. track down and eliminate protection schemes inside a single
  104. 35.000 bytes long executable file than to locate them inside a
  105. collection of many lengthy DLLs and overlaids that could have
  106. swollen as long as 2.000.000 bytes each. The lazy bunch of
  107. "modern" programmers relies systematically for protection schemes
  108. on this "hide the sting in the wide desert" logic. As a matter
  109. of fact they are no longer able to program in assembler: they
  110. bank more and more on overbloated "fatty" atrocities like Visual
  111. Basic, Delphy or Visual C++. (Don't worry... I'll nevertheless
  112. teach you how to crack -and quickly- those huge applications
  113. too).
  114.      There is another reason for employing games instead of
  115. applications as study material: often EXACTLY THE SAME protection
  116. schemes that you find in a simple (and short) shareware game will
  117. be used -without much improving- a little later in order to
  118. "protect" some huge and extremely expensive graphic application.
  119.      For this reason in my tutorial we'll often crack games
  120. protection schemes, even if we'll later apply what we learn
  121. mainly in order to crack the protection schemes of commercial
  122. applications, or to crack the access protection routines to
  123. remote servers, or BBS, or even ATM (cash dispensers). 
  124.      Here follows an example cracking session, that will show you
  125. -I hope- the dos and donts of our art: let's crack together as
  126. introductory example a time crippled application. We'll learn
  127. later (-> LESSON 4) that all applications that are crippled on
  128. time (i.e. "how many times" you use them or "how long" you use
  129. them) rely on analogous protection schemes (albeit with a huge
  130. palette of small variations): 
  131. 1-   they may have a counter which "clicks" every so often: FIND
  132.      IT AND DISABLE IT!
  133. 2-   they may fetch the time_clock interrupts in your machine:
  134.      INTERCEPT THEM YOURSELF!
  135. 3-   they may compare a random_seed with a variable: NOOP IT!
  136. 4-   they may check randomly the date of your other, unrelated,
  137.      files on the hard disk: find this verification routine and
  138.      INVERT the JUMPS!
  139. I wanted to start with a modern example of this "counter clicks"
  140. protection type, just to give you a feeling for cracking, and I
  141. have chosen a widely published demo: you should be able to find
  142. it pretty easily. In order to show you some of the problems you
  143. may encounter we'll crack this example "wrongly" (you'll learn
  144. how to crack effectively in the "HANDS ON" lessons).
  145.      EXAMPLE: ARCADE POOL, Demonstration version, PC Conversion
  146. by East Point Software Ltd, (c) Team 17 Software Ltd 1994. This
  147. demo has been published by many magazines on their CDRom covers
  148.  
  149. throughout 1995.
  150.      What follows will be useful even if you do not have our
  151.  
  152. example; nevertheless you should get a copy of this widespread
  153. demo in order to better grasp some of the following points.
  154.      This nice demo of a billiard game is time-crippled. It is
  155. crippled on how long you use it: i.e., you can only play 2
  156. minutes, afterwards a "nag" reminder of where and how you can buy
  157. the real version snaps: protectionist squalor at its best. 
  158.      So, how do you proceed? Where does the beginning begin? 
  159. Here is what you could (but not necessarily should) do:
  160.  
  161.      Get [Soft-ice] and load it in your config.sys. See the TOOLS
  162. OF THE TRADE lesson (-> LESSON 2) about this debugger. Version
  163. 2.6 of [Soft-Ice] has been cracked by MARQUIS DE SOIREE and can
  164. be found on the Web for free.
  165. -    vecs s (save all the vectors before loading the babe)
  166. -    start [pooldemo.exe]
  167. -    vecs c (vector compare, save a printing of all hooked
  168.      vectors)
  169. -    enter and leave Soft-ice a few times to understand what's
  170.      going on and where in [pooldemo.exe] are we roaming around
  171.      (you should always check MORE THAN ONCE your findings when
  172.      you snoop around: nothing moves and confuses pointers in a
  173.      more frenzied way than good old "inactive" DOS).
  174. -    have a good look at the map of memory usage ("map")
  175. -    now "snap_save" the main memory regions where
  176.      [pooldemo.exe] dwells... snapping saves "photographs" of
  177.      memory areas.
  178. -    do not do anything, let just the seconds go by.
  179. -    "snap_compare" every two or three seconds without moving
  180.      anything at all on the game board (no mouse_clicking,
  181.      NOTHING), so that the only changes are (hopefully) the
  182.      changes caused by the time counters. 
  183. -    snap_compare twice in a second.
  184. -    snap_compare at second 00:59 and at second 1:01.
  185. -    snap_compare just before and just after the time limit and
  186.      the snapping of the nag screen.
  187. -    Now collect carefully your printed "snaps" data: write
  188.      clearly on the various sheets the occurrences of the snaps.
  189. -    now comes the graceful "zen-cracking" moment: Sit down with
  190.      a dry Martini and Wodka (obviously only russian Wodka will
  191.      do) and contemplate the printing of the various mutant
  192.      locations. Feel, perceive, empathize! Look closely at the
  193.      locations that have changed in the snap compares. Analyze,
  194.      interpretate, evaluate.
  195. -    Mmm! Hey! Something fishy is changing there, and there, and
  196.      there! (you are lucky, few do actually change in this case:
  197.      only two dozen)
  198. -    breakpoint on execute at the location that you believe act
  199.      as a "continuous" counter, i.e. the location that triggers
  200.      the "a second went by" event when it zeroes.
  201. -    Now set the occurrence counter of BPX in order to break at
  202.      the moment where the location "refills" and restarts from
  203.      the beginning (the equivalent of "one second" went by,
  204.      let's start anew). Use the occurrence counter in order not
  205.      to single-step through the program your life long!
  206. -    IN THIS CASE you 'll quickly locate the refill at location
  207.      3DD0. Here follows the "refill" line:
  208.      xxxx:3DCC C706F1013C00   MOV  WORD PTR [01F1], 003C
  209. The "3C" byte at xxxx:3DD0 represents a counter_byte... i.e. the
  210. program "charges" 3C in this location and then DECs it step by
  211. step to 3B, 3A, 39, 38 etc... till 0. When it reaches 0: bingo!
  212. Sucker user has lost one second more of his precious two minutes.
  213.      Now, you would get a first wizard level if you searched
  214. further on for the exact point where you get the "nag screen" in
  215. order to eliminate the whole witless protection, but you may
  216. think you got it already and you remember anyway that the first
  217. principle in cracking is the following: "once you can eliminate
  218. the effects of a protection, do not look further!"
  219.      Most of the time this is true: you do not always need to
  220. eliminate a "whole" protection scheme (unless you are just
  221. studying it for the joy of it). It's normally easier (and
  222. quicker) to eliminate the "effects" of a given protection scheme.
  223. Unfortunately this is not true in this case.
  224.      Here you believe that you have already found the way: you
  225. got the counter that charges the reverse clock that triggers the
  226. particular protection scheme of [pooldemo.exe]. Now you may think
  227. that if you could modify the refill_value... say changing "3C"
  228. to "EE" (Yeah, the maximum would be FF... but it's always good
  229. practice to avoid such extreme values when cracking) you should
  230. get four times more playtime for your game... more than enough
  231. in order to make the protection scheme useless.
  232.      So you change location xxxx:3DD0 from "3C" to "EE". To work
  233. on bytes you should use a good Hexeditor like PSEDIT (Parity
  234. solutions, [Psedit.exe], brilliant shareware: see the "tool of
  235. the trade" section) but you could also work with simpler
  236. debuggers like [debug] or [symdeb] (-> see lesson 2). If you do,
  237. remember to work on a "dead" copy of your crippled [*.exe] file,
  238. i.e.:
  239.      ren POOLDEMO.EXE POOLDEMO.DED
  240.      symdeb POOLDEMO.DED
  241.      -s (cs+0000):0 Lffff C7 06 F1 01 3C <-  this string
  242.                                              corresponds to the
  243.                                              refill line).
  244.      cs:3E85   <- symdeb gives you two locations as answer
  245.      cs:3EEA
  246.      -e cs:3E85+4 EE     <- refill changed from 3C to EE
  247.      -w
  248.      ren POOLDEMO.DED POOLDEMO.EXE
  249. Now you run your tampered pooldemo. You think you cracked it, you
  250. glee with satisfaction... but loo! Nothing at all has changed,
  251. everything's as lame as before, you still have only 2 minutes
  252. playtime. How disappointing: how comez it didn't work?
  253.      Well, for a start you have not been attentive enough! The
  254. search in debug gave you TWO locations, you moron, and not just
  255. the one you just tampered with. Check and you 'll see that the
  256. second location (cs:3EEA) is a MIRROR/CONTROL location (more on
  257. this later). Some times there exist "double" locations... coz at
  258. times it's quicker to use a double routine than to use a
  259. branching if or switch structure... some times the second
  260. locations do mirror the first ones and correct them on the fly
  261. if need be. 
  262.      So you need to modify this too... you act as said above but
  263. this time you enter in debug a
  264.      -e cs:3EEA+4 EE 
  265. before writing back the dead file and then renaming it to exe and
  266.  
  267. then running it... and loo! Hoow sloow! THERE YOU ARE! Your
  268. crippled POOLDEMO.EXE is now (sort of) unprotected: You think
  269. that you can now play the stupid game up to 12 minutes real time,
  270. even if the protection scheme (and the counter) "believes" that
  271. it is playing only two minutes.
  272.      So you begin to play, and the seconds look veeery sloow, and
  273. everything seems OK, but -alas- NO! At screen second 28 you get
  274. the irritating "two minutes are over" nag screen! Obviously you
  275. were dead wrong: the program "knows" the time directly from the
  276. timer... you only modified the stupid counter ON THE SCREEN.
  277.      So it's back to cracking, and now you are angry, and forget
  278. the quiet ways of the zen-analyze and begin the heavy cracking
  279. you should reserve -if ever- for really complicated schemes. You
  280. now start to check the hooked vectors (you did your routinely
  281. VECS_save before loading pooldemo in [Soft-ice] and your
  282.  
  283. VECS_compare afterwards) and you see some findings that you
  284. believe interesting:
  285.           vecs c
  286.           08   1EFD:84C6 0CD1:17AC <- the clock
  287.           09   1EFD:85EC 136A:069C <- the keyboard
  288.           22   0BCE:02B1 0BCE:017E <- the terminate
  289.      That's more like it -you think. Smack at the beginning: the
  290. first hooked vector does it! It's good old interrupt_08: the
  291. timer_clicker!
  292.      Some basics for those of you that do not know anything:
  293. INT_08 controls indirectly the INT_1C timer interrupt. The 8253
  294. clock chip generates an IRQ_0 hardware interrupt at a rate of
  295. 18.2 interrupts per second. This gives control to the ISR
  296. (Interrupt Service Routine) that the INT_08 points to... and this
  297. should be at 0CD1:17AC, but has been hooked here, by pooldemo,
  298. to 1EFD:84C6.
  299.      One of the actions taken by the INT_08 ISR within the BIOS
  300. is to issue a software interrupt call to INT_1C, just in case any
  301. software modules within the system have established an intercept.
  302. If no intercepts have been established, the default contents of
  303. the INT_1C vector point to an iret instruction within the BIOS,
  304. so that a null action results. 
  305.      Normally a protectionist would intercept INT_1C, coz at
  306. every ISR from INT_08 the CPU would fetch the contents of the
  307. corresponding interrupt vector and make an interrupt style call
  308. to the code at that address (which should contain the iret at
  309. address F000:9876 but can contain any trick they could think of).
  310.      So -you think- the protectionist hooked here INT_08 directly
  311. (a pretty infrequently used protection scheme by the way): What
  312. now?
  313.      A rather drastic measure would be, in such circumstances,
  314. to
  315. disable the IRQ_0 level timer interrupt, which is controlled by
  316. bit 0 of the mask register, at address I/O 0021h. When bit 0
  317. within the mask register is set to 1, no further interrupts will
  318. be recognized for this IRQ level. This unfortunately won't work
  319. here, but it's an interesting technique per se, so you better
  320. learn it anyway, just in case you should need it elsewhere:
  321.  
  322. --- Trick to disable the timer ("IRQ_0 masking" by +ORC) ---
  323. *    prompt $t and hit ENTER a few times, see how the dos_clock
  324.      is merrily ticking along?
  325. *    enter DEBUG.COM
  326. *    Assemble using the command 'a'
  327. - a
  328. in al,21
  329. or al,1
  330. out 21,al
  331. ret
  332. RETURN
  333. RETURN    <- twice to exit immediate assembler
  334. - g 100   <- to run the tiny program.
  335. - q       <- to quit debug.
  336.  
  337. prompt $t is still on: hit ENTER a few times: 
  338. whoa! The clock has stopped advancing!
  339.  
  340.      Compliments: you loaded the current mask register's contents
  341. into AL, you set the mask bit in the bit 0 position (which
  342. corresponds to IRQ_0) at then updated the value back to the mask
  343. register.
  344.  
  345. When you are ready to activate IRQ_0 events again, reenter DEBUG,
  346. run the following and then reset the clock you stopped with DOS
  347. TIME command:
  348. - a
  349. in al,21
  350. and al,fe
  351. out 21,al
  352. ret
  353. RETURN twice
  354. - g 100
  355. - q 
  356.  
  357. A word of caution: with the timer click disabled some processes
  358. will not operate correctly: once you access the diskette drive,
  359. the motor will continue to run indefinitely afterwards, etcetera.
  360. -------------------------------------------------------
  361.  
  362.      Unfortunately the above technique cannot work with our
  363. [pooldemo.exe], where you now are looking closely to the INT_08
  364. hook you found, believing that it hides the protection scheme:
  365.  
  366. herein you find immediately the EoI (End_of_interrupt: MOV
  367. AL,20h... OUT 20h,AL). Both controllers have a second port
  368. address at 20h (or 0a0h), from which the instructions are given.
  369. The most important is the EoI command (20h). This instruction
  370. indicates the end of the interrupt handler and frees up the
  371. corresponding controller for the next interrupt. If somebody
  372. writes a new custom interrupt handler (as many protectionists
  373. do), it's up to him to see to it that at the end of the handler
  374. the EoI command (20h) is written to either port 20h or port 0a0h.
  375.      After the EoI follow the usual pushes, then some CALLS then
  376. a call that issues some OUT 40,AL that look like timer refreshing
  377. (OUT transfers data to an output port and ports 40-42 correspond
  378. to the Timer/counter). Some do_maintenance follows, then a double
  379. CALL, one more conditional CALL and then a "mysterious" call FAR
  380. CS:[AA91] on which depends a byte PTR[970C] that decides another
  381. final CALL... then the routine pops all registers and irets away.
  382.      Ah! You say, and begin disassembling, reverse engineering
  383. and looking inside each suspect call (the quicker method in
  384. these cases is to breakpoint calls on entrance and see if you
  385. find the one that's only called at the awakening of the time
  386. limit protection). 
  387.      You work, and work, and work... and eventually find nothing
  388. at all, coz the protection of this program is NOT HERE!
  389.  
  390.      Back to the zen-analyze of the snap printings... we forsake
  391. it too soon, as you will see.
  392.      If you watch with more attention the compare locations for
  393.  
  394. the range DS:0 DS:FFFF you 'll notice that one of them changes
  395. relatively slowly from 0 to 1 to 2 to 3 and so on... the
  396. precedent location changes very quickly, and runs the complete
  397. cycle 0...FF. That's a counter, at locations DS:0009 and DS:000A!
  398. How long will it tick along? Well, we saw above that the "charge"
  399. every second is 3C, so it will be x3C*x78=x1C20, coz x78 is 120
  400. seconds, i.e. the two minutes time limit.
  401.      Now search this 1C20 value around inside the code
  402. (protections are most of the time at the beginning of the
  403. CS:offset section), and you 'll find quickly what follows:
  404. The protection in [pooldemo.exe] is at code_locations
  405.  
  406. CS:0A8A   813E20A7201C   CMP  WORD PTR [A720], 1C20
  407.                          compare location A720 with limit 1C20
  408. CS:0A90   7C07           JL   okay_play_a_little_more
  409. CS:0A92   E834FD         CALL beggar_off_time_is_up
  410.  
  411.      BINGO!: FOUND!
  412.  
  413. Now let's quickly crack it:
  414. ------------------------------------------------
  415. CRACKING POOLDEMO.EXE (by +ORC, January 1996)
  416.  
  417. ren pooldemo.exe pooldemo.ded
  418. symdeb pooldemo.ded
  419. -    s cs:0 Lffff 81 3E 20 A7 20 1C
  420. xxxx:yyyy           <- this is the answer of the debugger
  421. -    e xxxx:yyyy+5 4C  <- this time limit is much better
  422. -    w
  423. -    q
  424. ren pooldemo.ded pooldemo.exe
  425. -------------------------------------------------
  426.      We have done here a "weak" crack: we limited ourselves to
  427. accept a (better) time limit, changing it from 1C20 to 4C20 (4
  428. minutes instead of two). We could obviously have done a more
  429. radical crack if we had changed the JL (jump lower) instruction
  430. in a JMP (jump anyway) instruction. In this case it would have
  431. worked, but for reasons that will be explained in lesson 4, you
  432. should choose a rather delicate approach in cracking when you
  433. deal with time-limit protection schemes.
  434.      As you have seen, in this artificial cracking session we
  435.  
  436. found the protection scheme after a little snooping around. But,
  437. as you will see in the hands on part, there are always MANY ways
  438. to crack a single protection scheme. You could -for instance-
  439. have found this protection the other way round: set a trace on
  440. memory range for the program, restricting the trace to the first
  441. part of it (say CS:0 to CS:1000, if you do not fetch anything you
  442. can always try the other blocks). Breakpoint at the nag screen,
  443. have a look at the last 300-400 backtraced instructions, if you
  444. did not move anything, everything will follow a repetitive
  445. pattern, until the protection snaps on:
  446.        ... 
  447.        JL 0A99 
  448.        CMP BYTE PTR [A72A],01
  449.        ...
  450.        JL 0A99 
  451.        CMP BYTE PTR [A72A],01
  452.        ...
  453.        for ages and ages and then...
  454.        ... 
  455.        JL 0A99 
  456. E834FD CALL 0759           <- BINGO! (CALL beggar_off_time_is_up)
  457.  
  458. ... there it is, found the other way round. (But this apparently
  459. better method is unfortunately very unstable: it depends on your
  460. timing of the breaking in and on the distance between protection
  461. and nag screen, therefore the somehow more complicated, but more
  462. sure previous one should be favoured).
  463.  
  464.      The reason why "minimal" approaches in cracking are often
  465. more successful than heavy vector_cracking, is that the programs
  466. are hardly ever "overprotected", and therefore the protections
  467. are seldom difficult to find (and those that are really worth
  468. cracking for study reasons). 
  469.      Sometime you don't even need to crack anything at all! Some
  470. applications are fully functional -per se-, but have been
  471. crippled in a hurry in order to release them as demos. The
  472. commercial programmers want only money, do not even try to
  473. understand our zen ways, and do not care at all for a well done
  474. job. That means, among other things, that the hard disk of the
  475. user will be cluttered with files that the main program module
  476. never calls. A typical example of this sloppy method is the demo
  477. of [Panzer General] from SSI that appeared in the summer '95.
  478. This was in reality no less than the complete beta version of the
  479. game: you just had to substitute to one of the two "allowed"
  480. scenarios one of the 20 or more scenarios of the beta version in
  481. order to play them freely... you didn't ever need to crack! 
  482.      The pooldemo crack example above should not discourage you
  483. from cracking intuitively. Be careful! Perform a thoroughly
  484. zen_analyze before attempting deeper methods: do remember that
  485. you want to crack the protection scheme SOMEHOW, and not
  486. necessarily following the same line of thought that the
  487. programmer eventually WANTED YOU TO CRACK IT with. 
  488.  
  489. Well, that's it for this lesson, reader. Not all lessons of my
  490. tutorial are on the Web.
  491.  
  492.      You 'll obtain the missing lessons IF AND ONLY IF you mail
  493. me back (via anon.penet.fi) with some tricks of the trade I may
  494. not know that YOU discovered. Mostly I'll actually know them
  495. already, but if they are really new you'll be given full credit,
  496. and even if they are not, should I judge that you "rediscovered"
  497. them with your work, or that you actually did good work on them,
  498. I'll send you the remaining lessons nevertheless. Your
  499. suggestions and critics on the whole crap I wrote are also
  500. welcomed.
  501.  
  502. +ORC an526164@anon.penet.fi